package cn.itcast.shop.product.dao;

import java.sql.SQLException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import cn.itcast.shop.product.vo.Product;
import cn.itcast.shop.utils.PageBean;
import cn.itcast.shop.utils.PageHibernateCallback;

public class ProductDao extends HibernateDaoSupport {

	/**
	 * 首页上的热门商品查询
	 * @return
	 */
	public List<Product> findHot() {
		//使用离线条件查询。
		DetachedCriteria criteria = DetachedCriteria.forClass(Product.class);
		//查询热门的商品，条件就是 is_hot=1
		criteria.add(Restrictions.eq("isHot", 1));
		//倒序排序输出：
		criteria.addOrder(Order.desc("pdate"));
		//执行查询：
		@SuppressWarnings("unchecked")
		List<Product> list = this.getHibernateTemplate().findByCriteria(criteria,0,10);
		return list;
	}

	/**
	 * 首页上的最新商品查询
	 * @return
	 */
	public List<Product> findNew() {
		//使用离线条件查询。
		DetachedCriteria criteria = DetachedCriteria.forClass(Product.class);
		//倒序排序输出：
		criteria.addOrder(Order.desc("pdate"));
		//执行查询：
		@SuppressWarnings("unchecked")
		List<Product> list = this.getHibernateTemplate().findByCriteria(criteria,0,10);
		return list;
	}

	/**
	 * 根据商品的ID进行查询商品详细信息
	 * @param pid
	 * @return
	 */
	public Product findByPid(Integer pid) {
		
		return this.getHibernateTemplate().get(Product.class, pid);
	}
	
	/**
	 * 根据一级分类id查询商品的个数
	 * @param cid
	 * @return
	 */
	public int findCountCid(Integer cid) {
		String hql = "select count(*) from Product p where p.categorySecond.category.cid=?";
		@SuppressWarnings("unchecked")
		List<Long> list = this.getHibernateTemplate().find(hql,cid);
		if (list!=null&&list.size()>0) {
			return list.get(0).intValue();
		}
		return 0;
	}

	/**
	 * 根据一级分类id查询商品的集合
	 * @param cid
	 * @param begin
	 * @param limit
	 * @return
	 */
	public List<Product> findByPageCid(Integer cid, int begin, int limit) {
		//select p.* from category c.categorysecond cs product p where c.cid=cs.cid and cs.csid=p.csid and c.cid=2
		//select p from Category c,CategorySecond cs,Product p where c.cid=cs.category.cid and cs.csid = p.categorySecond.csid and c.cid=?
		String hql="select p from Product p join p.categorySecond cs join cs.category c where c.cid=?";
		//分页的另一种写法：
		List<Product> list= this.getHibernateTemplate().execute(new PageHibernateCallback<Product>(hql,new Object[]{cid},begin,limit));
		if (list!=null&&list.size()>0) {
			return list;
		}
//		this.getHibernateTemplate().execute(new HibernateCallback<T>(){
//			@Override
//			public T doInHibernate(Session session) throws HibernateException, SQLException {
//				Query query= session.createQuery(hql);
//				query.setBigInteger(arg0, arg1);
//				return null;
//			}
//		});
		
		return null;
	}

	/**
	 * 根据二级分类id查询商品的个数
	 * @param csid
	 * @return
	 */
	public int findCountCsid(int csid) {
		String hql = "select count(*) from Product p where p.categorySecond.csid=?";
		@SuppressWarnings("unchecked")
		List<Long> list = this.getHibernateTemplate().find(hql,csid);
		if (list!=null&&list.size()>0) {
			return list.get(0).intValue();
		}
		return 0;
	}

	/**
	 * 根据二级分类id查询商品的集合
	 * @param csid
	 * @param begin
	 * @param limit
	 * @return
	 */
	public List<Product> findByPageCsid(int csid, int begin, int limit) {
		String hql="select p from Product p join p.categorySecond cs where cs.csid=?";
		//分页的另一种写法：
		List<Product> list= this.getHibernateTemplate().execute(new PageHibernateCallback<Product>(hql,new Object[]{csid},begin,limit));
		if (list!=null&&list.size()>0) {
			return list;
		}
		return null;
	}

	/**
	 * 后台商品管理统计总个数
	 * @return
	 */
	public int findCount() {
		String hql = "select count(*) from Product ";
		@SuppressWarnings("unchecked")
		List<Long> list = this.getHibernateTemplate().find(hql);
		if (list!=null&&list.size()>0) {
			return list.get(0).intValue();
		}
		return 0;
	}

	/**
	 * 带有分页查询商品的方法
	 * @param begin
	 * @param limit
	 * @return
	 */
	public List<Product> findByPage(int begin, int limit) {
		String hql=" from Product order by pdate desc ";
		//分页的另一种写法：
		List<Product> list= this.getHibernateTemplate().execute(new PageHibernateCallback<Product>(hql,null,begin,limit));
		if (list!=null&&list.size()>0) {
			return list;
		}
		return null;
	}

	public void save(Product product) {
		this.getHibernateTemplate().save(product);
	}

	/**
	 * 
	 * @param product
	 */
	public void delete(Product product) {
		this.getHibernateTemplate().delete(product);
	}

	public void update(Product product) {
		this.getHibernateTemplate().update(product);
	}


   
}

































